package com.ylr.send.framework.controller.web;

import java.util.List;
import java.util.Map;
import java.util.Objects;

import com.ylr.send.common.dto.SmsTemplateDto;
import com.ylr.send.common.dto.SmsTemplatePageEnumDto;
import com.ylr.send.common.vo.SmsTemplateFormVo;
import com.ylr.send.common.vo.SmsTemplateVo;
import com.ylr.send.framework.service.SmsTemplateService;
import com.ylr.base.common.annotation.Resubmit;
import com.ylr.base.common.dto.PageDto;
import com.ylr.base.common.jsr303.group.OrderSearch;
import com.ylr.base.common.jsr303.group.Save;
import com.ylr.base.common.jsr303.group.Update;
import com.ylr.base.common.tool.Result;
import com.ylr.base.common.vo.UpdateStatusVo;
import com.ylr.send.framework.manager.SmsManager;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Size;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-06-14 21:23:54
 * className: SmsTemplateWebController
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/web/sms-template")
@AllArgsConstructor
public class SmsTemplateWebController {

    private static final Logger log = LoggerFactory.getLogger(SmsTemplateWebController.class);

    private final SmsTemplateService smsTemplateService;

    private final SmsManager smsManager;

    /**
     * 保存短信模板接口
     * <p>
     * 此接口会校验是否重复提交
     * @param smsTemplateVo 参数对象
     */
    @Resubmit(spEL = "'saveSmsTemplate'.concat(#userPo.id)", message = "保存短信模板")
    @PostMapping("/save")
    public Result<Object> saveSmsTemplate(@Validated(Save.class) @RequestBody SmsTemplateVo smsTemplateVo) {
        log.info("web => 开始保存短信模板操作。{}", smsTemplateVo);

        smsTemplateService.saveSmsTemplate(smsTemplateVo);

        log.info("web => 保存短信模板操作结束");
        return Result.success();
    }

    /**
     * 分页查询短信模板接口
     * @param smsTemplateFormVo 参数对象
     * @return 短信模板分页数据
     */
    @GetMapping("/page/list")
    public Result<PageDto<SmsTemplateDto>> pageSmsTemplateList(@Validated(OrderSearch.class) @RequestBody SmsTemplateFormVo smsTemplateFormVo) {
        log.info("web => 开始分页查询短信模板操作。{}", smsTemplateFormVo);

        PageDto<SmsTemplateDto> pageDto = smsTemplateService.pageSmsTemplateList(smsTemplateFormVo);

        log.info("web => 分页查询短信模板操作结束");
        return Result.success(pageDto);
    }


    /**
     * 获取短信模板接口
     * @param id 主键
     * @return 短信模板数据
     */
    @GetMapping("/get")
    public Result<SmsTemplateDto> getSmsTemplate(@RequestParam("id") Long id) {
        log.info("web => 开始获取短信模板操作。id={}", id);

        SmsTemplateDto smsTemplateDto = smsTemplateService.getSmsTemplate(id);

        log.info("web => 获取短信模板操作结束");
        return Result.success(smsTemplateDto);
    }

    /**
     * 获取短信渠道自有的参数接口
     * @param channel 短信渠道
     * @return 短信参数映射
     */
    @GetMapping("/get/channel-param")
    public Result<Map<String, String>> getChannelParam(@RequestParam("channel") Integer channel) {
        log.info("web => 开始获取短信渠道自有的参数操作。channel={}", channel);

        Map<String, String> channelParam = smsManager.getChannelParam(channel);

        log.info("web => 获取短信渠道自有的参数操作结束");
        return Result.success(channelParam);
    }

    /**
     * 获取短信模板页面枚举接口
     * @return 枚举数据
     */
    @GetMapping("/page/enum")
    public Result<SmsTemplatePageEnumDto> getPageEnum() {
        log.info("web => 开始获取短信模板页面枚举操作");

        SmsTemplatePageEnumDto smsTemplatePageEnumDto = smsTemplateService.getPageEnum();

        log.info("web => 获取短信模板页面枚举操作结束");
        return Result.success(smsTemplatePageEnumDto);
    }

    /**
     * 修改短信模板接口
     * <p>
     * 此接口会校验是否重复提交
     * @param smsTemplateVo 参数对象
     */
    @Resubmit(spEL = "'updateSmsTemplate'.concat(#userPo.id)", message = "修改短信模板")
    @PostMapping("/update")
    public Result<Object> updateSmsTemplate(@Validated(Update.class) @RequestBody SmsTemplateVo smsTemplateVo) {
        log.info("web => 开始修改短信模板操作。{}", smsTemplateVo);

        smsTemplateService.updateSmsTemplate(smsTemplateVo);

        log.info("web => 修改短信模板操作结束");
        return Result.success();
    }

    /**
     * 修改短信模板状态接口
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(spEL = "'updateSmsTemplateStatus'.concat(#userPo.id)", message = "修改短信模板状态")
    @PostMapping("/update/status")
    public Result<Object> updateSmsTemplateStatus(@RequestBody UpdateStatusVo updateStatusVo) {
        log.info("web => 开始修改短信模板状态操作。{}", updateStatusVo);

        List<Long> idList = updateStatusVo.getIdList();
        int length = idList.size();
        for (int i = 0; i < length; i++) {
            if (Objects.isNull(idList.get(i))) {
                return Result.requestFail("第" + (i + 1) + "个主键值为空，请求失败");
            }
        }

        smsTemplateService.updateSmsTemplateStatus(updateStatusVo);

        log.info("web => 修改短信模板状态操作结束");
        return Result.success();
    }

    /**
     * 删除短信模板接口
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     */
    @Resubmit(spEL = "'deleteSmsTemplate'.concat(#userPo.id)", message = "删除短信模板")
    @DeleteMapping("/delete")
    public Result<Object> deleteSmsTemplate(@Size(min = 1, message = "主键列表不能为空") @RequestBody List<Long> idList) {
        log.info("web => 开始删除短信模板操作。idList={}", idList);

        int length = idList.size();
        for (int i = 0; i < length; i++) {
            if (Objects.isNull(idList.get(i))) {
                return Result.requestFail("第" + (i + 1) + "个主键值为空，请求失败");
            }
        }

        smsTemplateService.deleteSmsTemplate(idList);

        log.info("web => 删除短信模板操作结束");
        return Result.success();
    }

}
